package com.cool.controller.sysmanagecontroller;

import com.cool.bo.sysmanage.common.PageQueryBo;
import com.cool.common.CommonResult;
import com.cool.common.ResponseCode;
import com.cool.po.sysmanagepo.MenuPo;
import com.cool.service.sysmanage.DdMenuService;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.*;

/**
 * 菜单表(DdMenu)表控制层
 *
 * @author Jungle
 * @since 2020-07-28 16:47:20
 */
@RestController
@RequestMapping("/menu")
@Slf4j
public class DdMenuController {
    /**
     * 服务对象
     */
    @Resource
    private DdMenuService ddMenuService;

    /**
     * 树列表
     *
     * @return {@link CommonResult }
     * @author Jiangmanman
     * @date 2020/07/30
     */
    @GetMapping("/treeList")
    public CommonResult getTreeList() {


        // 整体思路：
        // 1、取得所有数据、放入集合List1 （tbCategories）
        // 2、将List1所有数据都放入到map（treeMap）中：元素id为键，元素本身对象为值
        // 3、取得顶层节点放入集合List2中（resultList）
        // 4、遍历List1中的所有数据，通过数据的parentId为键在map中取值
        //      1）如果能取到，则说明该元素有父节点
        //           1、判断该父节点下的childList中是否有已经子节点
        //              1、若无：则创建一个集合，将子节点放入
        //              2、若有：则直接将子节点放入即可
        // 5、把放好的数据放回到map中
        // 6、返回List2（resultList）
        // 注意：整个过程将所有数据取出放入list2（resultList）,返回的也是    //list2


        log.info("treelist");

        List<MenuPo> tbCategories = ddMenuService.selectTreeList();

        List<MenuPo> menuPos = DdMenuController.listToTree(tbCategories);


        if (tbCategories.size() < 1) {
            return CommonResult.newCommonResult().setCode(ResponseCode.MENUN_QUERYALL_FAILURE).setMsg("暂无数据");
        }


        return CommonResult.newCommonResult().setCode(ResponseCode.USER_LOGIN_SUCCESS).setMsg("查询成功").setData(menuPos);
    }


    /**
     * 列表树
     *
     * @param list 列表
     * @return {@link List<MenuPo> }
     * @author Jiangmanman
     * @date 2020/07/30
     */
    public static List<MenuPo> listToTree(List<MenuPo> list) {
        //用递归找子。
        List<MenuPo> treeList = new ArrayList<MenuPo>();
        for (MenuPo tree : list) {
            if (tree.getMenuParentId() == 0) {
                treeList.add(findChildren(tree, list));
            }
        }
        return treeList;
    }

    /**
     * 递归查找
     *
     * @param tree 树
     * @param list 列表
     * @return {@link MenuPo }
     * @author Jiangmanman
     * @date 2020/07/28
     */
    private static MenuPo findChildren(MenuPo tree, List<MenuPo> list) {

        for (MenuPo node : list) {
            if (node.getMenuParentId().equals(tree.getMenuId())) {
                if (tree.getChildren() == null) {
                    tree.setChildren(new ArrayList<MenuPo>());
                }
                tree.getChildren().add(findChildren(node, list));
            }
        }
        return tree;
    }

    /**
     * 得到列表
     *
     * @param menuParentId 菜单父id
     * @param pageNum      页面num
     * @param pageSize     页面大小
     * @return {@link CommonResult }
     * @author Jiangmanman
     * @date 2020/07/30
     */
    @GetMapping("/list/{id}")
    public CommonResult getList(@PathVariable("id") Integer menuParentId, Integer pageNum, Integer pageSize) {

        PageQueryBo pageQueryBo = ddMenuService.pagingQuery(menuParentId, pageNum, pageSize);

        return CommonResult.newCommonResult().setCode(ResponseCode.USER_LOGIN_SUCCESS).setMsg("查询成功").setData(pageQueryBo);
    }

    /**
     * 创建菜单
     *
     * @param menuPo 菜单
     * @return {@link CommonResult }
     * @author Jiangmanman
     * @date 2020/07/30
     */
    @PostMapping("/create")
    public CommonResult createMenu(@RequestBody MenuPo menuPo) {
        Integer len = ddMenuService.insert(menuPo);

        if (len < 1) {
            return CommonResult.newCommonResult().setCode(ResponseCode.MENU_CREATE_FAILURE).setMsg("创建菜单失败");
        } else {
            return CommonResult.newCommonResult().setCode(ResponseCode.USER_LOGIN_SUCCESS).setMsg("创建菜单成功");

        }
    }

    /**
     * 得到一条消息根据ID
     *
     * @return {@link CommonResult }
     * @author Jiangmanman
     * @date 2020/07/29
     */
    @GetMapping("{id}")
    public CommonResult getMsg(@PathVariable("id") Integer id) {

        MenuPo menuPo = ddMenuService.selectById(id);

        return CommonResult.newCommonResult().setCode(ResponseCode.USER_LOGIN_SUCCESS).setMsg("查询成功").setData(menuPo);
    }

    /**
     * 更新数据
     *
     * @param id     id
     * @param menuPo 菜单阿宝
     * @return {@link CommonResult }
     * @author Jiangmanman
     * @date 2020/07/30
     */
    @PostMapping("update/{id}")
    public CommonResult updateMsg(@PathVariable("id") Integer id,@RequestBody MenuPo menuPo) {

        Integer len = ddMenuService.updateById(id,menuPo);
        if (len < 1) {
            return CommonResult.newCommonResult().setCode(ResponseCode.MENU_UPDATE_FAILURE).setMsg("更新失败");
        } else {
            return CommonResult.newCommonResult().setCode(ResponseCode.USER_LOGIN_SUCCESS).setMsg("更新成功");

        }
    }

    /**
     * 删除单条数据
     *
     * @param id id
     * @return {@link CommonResult }
     * @author Jiangmanman
     * @date 2020/07/30
     */
    @PostMapping("/delete/{id}")
    public CommonResult deleteMsg(@PathVariable("id") Integer id) {

        Integer len = ddMenuService.deleteById(id);
        if (len < 1) {
            return CommonResult.newCommonResult().setCode(ResponseCode.MENU_UPDATE_FAILURE).setMsg("删除失败");
        } else {
            return CommonResult.newCommonResult().setCode(ResponseCode.USER_LOGIN_SUCCESS).setMsg("删除成功");

        }
    }

    /**
     * 更新隐藏状态
     *
     * @param id    id
     * @param state 状态
     * @return {@link CommonResult }
     * @author Jiangmanman
     * @date 2020/07/30
     */
    @PostMapping("/updateHidden/{id}")
    public CommonResult updateHidden(@PathVariable("id")Integer id,@RequestParam("state")Integer state){
        Integer len = ddMenuService.updateState(id,state);
        if (len < 1) {
            return CommonResult.newCommonResult().setCode(ResponseCode.MENU_UPDATE_FAILURE).setMsg("更新失败");
        } else {
            return CommonResult.newCommonResult().setCode(ResponseCode.USER_LOGIN_SUCCESS).setMsg("更新成功");

        }
    }



}